òɾۿûѧϰʹá
ԭַhttps://www.joinquant.com/post/12916

ԭһ˵ʽ鵽ԭĺ߽ۡ


ԭĲԴ£

# 뺯
import jqdata
import numpy as np
import pandas as pd
import datetime
import time
#import statsmodels.api as sm
from sklearn import linear_model
from sklearn.preprocessing import Imputer
# ʼ趨׼ȵ
def initialize(context):
    # 趨300Ϊ׼
    set_benchmark('000300.XSHG')
    # ̬Ȩģʽ(ʵ۸)
    set_option('use_real_price', True)
    
    # ˵orderϵAPIıerror͵log
    # log.set_level('order', 'error')
    
    set_option('use_real_price',True) # ʵ۸
    log.set_level('order','error')    # ñȼ
    ### Ʊ趨 ###
    # ƱÿʽʱǣʱӶ֮ʱӶ֮ǧ֮һӡ˰, ÿʽӶͿ5Ǯ
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    set_pas()    #1òԲ
    set_variables() #2м
    
    ## кreference_securityΪʱĲοģıֻ֣˴'000300.XSHG''510300.XSHG'һģ
      # ǰ
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') 
      # ʱ
    run_daily(market_open, time='open', reference_security='000300.XSHG')
      # ̺
    run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')


def set_pas():
    g.tc = 7  # õ
    g.num_stocks = 5  # ÿεѡȡĹƱ
    # Ʊأ֤180ָɷֹ
    g.index='000010.XSHG'
    g.stocks = get_index_stocks(g.index)


#м
def set_variables():
    g.t = 0 #¼زе
    g.if_trade = False #Ƿ
    
#ûز



def calAt(stock,date,n):
    #Ʊstocknվ
    #ڼ㵱ֵ
    #stockƱ룻date:ڣn:ǰn
    price = get_price(stock,end_date=date, frequency='daily', fields='close', skip_paused=True, fq='pre', count=n)
    At = mean(price)
    Atadjust = At/price.tail(1)
    Atadjust = Atadjust.iloc[0,0]
    return Atadjust
#ֵ

def calAtevery(stock,flagDate,n):
    #Ʊstocknվ
    #ڼ ѵ ĺ
    date = flagDate
    price = get_price(stock,end_date=flagDate, frequency='daily', fields='close', skip_paused=True, fq='pre', count=n)
    At = mean(price)
    Atadjust = At/price.tail(1)
    return Atadjust
#pandas

#ѵ
def calATlist(stock,date,n):
    lastDate = date
    #lastDate = datetime.datetime.strptime(date, '%Y-%m-%d')
    #ʱΪdate
    delta = datetime.timedelta(days=7)
    lastDate = lastDate - delta
    #ǰһ ѵ ATӣΪҪǰһܵӺ͵ܵʻع飩
    At = []
    for i in range(25):
        temp = calAtevery(stock,lastDate,n)
        At.append(temp.iloc[0,0])
        lastDate = lastDate - delta
    return At
 
def calEstYeild(stock,date):
    k = [3, 5, 10, 20, 30, 60,90,120, 180, 240, 270, 300]
    ATlist=[]
    # ǰ25λʱڸȵľ Լ 
    df = pd.DataFrame()
    for item in k:
        df['%s'%item]=calATlist(stock,date,item)
    #ӵһ    
        df['rflist']=calRFlist(stock,date)
        
    # Ԥֵ
    st = [1,2,3,4,5,6,7,8,9,10,11,12]
    for i,item in enumerate(k):
        st[i] = calAt(stock,date,item)
        
        #Իع鲿
    
    #imp = Imputer(missing_values='NaN',strategy='mean',axis=0,verbose=0,copy=True)
    #df = imp.fit_transform(df)
    #df = pd.DataFrame(df)
    #df.columns = ['3','5','10','20','30','60','90','120','180','240','270','300','rflist']
    
    #log.info(df)
    
    y = df['rflist']
    x = df[['3','5','10','20','30','60','90','120','180','240','270','300']]
    clf = linear_model.LinearRegression()
    clf.fit(x,y)
    yhat = clf.predict(st)
    #x = sm.add_constant(x)#ӽؾ
    #est = sm.OLS(y,x).fit()
    #est.summary() #ͳ
    #est.params #鿴ع
    #Ԥ
    #yhat = est.predict(st)
    return yhat
   
def calRFlist(stock,date):
    #
    nowDate = date
    #nowDate = datetime.datetime.strptime(date, '%Y-%m-%d')
    delta = datetime.timedelta(days=7)
    rflist = []
    for i in range(25):
        weekprice = get_price(stock,end_date=nowDate,frequency='daily',fields=['close','open'],count=5,skip_paused=True)
        cp = weekprice.iloc[1,-1]
        op = weekprice.iloc[2,1]
        rf = (cp-op)/op
        rflist.append(rf)
        nowDate = nowDate - delta
    return rflist   

def SortStockList(stocks,date):
    df = pd.DataFrame()
    for stock in stocks:
        df['%s'%stock] = calEstYeild(stock,date)
    df = df.T
    stockListSorted = df.sort(columns=0)
    return stockListSorted

def set_slip_fee(context):
    # Ϊ0
    set_slippage(FixedSlippage(0)) 
    # ݲͬʱ
    dt=context.current_dt
    log.info(type(context.current_dt))
    
    if dt>datetime.datetime(2013,1, 1):
        set_commission(PerTrade(buy_cost=0.0003, sell_cost=0.0003, min_cost=5)) 
        
    elif dt>datetime.datetime(2011,1, 1):
        set_commission(PerTrade(buy_cost=0.001, sell_cost=0.002, min_cost=5))
            
    elif dt>datetime.datetime(2009,1, 1):
        set_commission(PerTrade(buy_cost=0.002, sell_cost=0.003, min_cost=5))
                
    else:
        set_commission(PerTrade(buy_cost=0.003, sell_cost=0.004, min_cost=5))    


## ǰк     
def before_market_open(context):
    if g.t%g.tc==0:
        #ÿg.tc죬һ
        g.if_trade=True 
        # 
        # set_slip_fee(context)
    
## ʱк
def market_open(context):
    log.info(g.t, g.tc, g.if_trade)
    date = context.current_dt
    if g.if_trade == True:
        # ԵźţõӦĹƱб
        MS_should_buy = SortStockList(g.stocks,date).tail(5).index
        log.info(MS_should_buy)
        # ڵʲԷʽǵȶȨط һ
        MonPerStock=context.portfolio.portfolio_value/g.num_stocks
        # õǰֲпĹƱ
        if len(context.portfolio.positions)>0:
            #ֲֲΪʱ޳ֲֹƱͣƹɼ list
            holding = context.portfolio.positions
        else:
            # ֲΪ0ʱƱΪ0 list
            holding = []
        # ڲҪֲֵĹƱȫ
        for stock in holding:
            if stock not in MS_should_buy:
                order_target_value(stock, 0)
        # ҪֲֵĹƱ䵽ķݶ
        for stock in MS_should_buy:
            order_target_value(stock, MonPerStock)
    g.if_trade = False
    
## ̺к  
def after_market_close(context):
    g.t+=1
    log.info(str('ʱ(after_market_close):'+str(context.current_dt.time())))
    #õгɽ¼
    trades = get_trades()
    for _trade in trades.values():
        log.info('ɽ¼'+str(_trade))
    log.info('һ')
    log.info('##############################################################')

    pass
